package matrices;

/**
 * Matrix Interface
 * @author s0932248
 *
 */

public interface Matrix {
	
	/**
	 * Returns the rows and columns of the Matrix
	 * @return
	 */
	public int getRows();
	public int getColumns();
	
	/**
	 * Matrix Element pointer, use when you want to alter the elements of a matrix dynamically
	 * @param row
	 * @param column
	 * @return
	 * @throws IllegalArgumentException
	 */
	
	public MatrixElement getElementPointerAt(int row, int column) throws IllegalArgumentException;
	public void setElementPointerAt(int row, int column, MatrixElement newElement) throws IllegalArgumentException;
	
	/**
	 * Use for accessing the VALUE of an element, use when you don't want to accidentally alter
	 * the element later
	 * @param row
	 * @param column
	 * @return
	 * @throws IllegalArgumentException
	 */
	public MatrixElement getElementValueAt(int row, int column) throws IllegalArgumentException;
	public void setElementValueAt(int row, int column, MatrixElement newElement) throws IllegalArgumentException;
	
	public MatrixElement getDefaultElementValue();
	public void setDefaultElementValue(MatrixElement value);
	
	public MatrixElement getDefaultElementPointer();
	public void setDefaultElementPointer(MatrixElement pointer);
	
	public Matrix mAdd(Matrix ... matrices);
	public Matrix mSubtract(Matrix matrix);
	public Matrix mMultiply(Matrix matrix) throws IllegalArgumentException ;
	public Matrix scalarMultiply(MatrixElement scale);
	public MatrixElement getDeterminant();
	public Matrix getEigenvalues();
	public Matrix getInverse();
	public Matrix getTranspose();
}
